#include <stdio.h>
#include <stdlib.h>

// 问题说明：
// 火星人通过手指排列表示数字，每个排列对应其在所有可能排列中的字典序排名（从1开始）
// 任务是将初始排列对应的排名加上M，得到新排名对应的排列

int main() {
    int n, m;
    // 读取手指数量n和要添加的数字m
    scanf("%d %d", &n, &m);
    
    // 存储火星人手指的初始排列
    int* arr = (int*)malloc(n * sizeof(int));
    for (int i = 0; i < n; i++) {
        scanf("%d", &arr[i]);
    }
    
    // 重复m次"求下一个排列"的操作
    for (int step = 0; step < m; step++) {
        // 步骤1：从后向前找第一个元素，使其小于后一个元素（找到i）
        // 这个元素是排列中可以调整的起始位置
        int i = n - 2;  // 从倒数第二个元素开始
        while (i >= 0 && arr[i] >= arr[i + 1]) {
            i--;  // 找到arr[i] < arr[i+1]为止
        }
        
        // 步骤2：从后向前找第一个大于arr[i]的元素（找到j）
        // 这个元素是用来与i位置交换的最小可能值，保证后续排列最小
        int j = n - 1;
        while (arr[j] <= arr[i]) {
            j--;
        }
        
        // 步骤3：交换i和j位置的元素
        // 交换后，i位置变为更大的元素，为后续调整奠定基础
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
        
        // 步骤4：反转i+1到末尾的元素
        // 因为交换后i+1到末尾是降序，反转后变为升序，保证是最小的下一个排列
        int left = i + 1;
        int right = n - 1;
        while (left < right) {
            // 交换左右指针元素
            temp = arr[left];
            arr[left] = arr[right];
            arr[right] = temp;
            left++;
            right--;
        }
    }
    
    // 输出最终的手指排列
    for (int i = 0; i < n; i++) {
        if (i > 0) {
            printf(" ");  // 元素间用空格分隔
        }
        printf("%d", arr[i]);
    }
    printf("\n");
    
    // 释放动态分配的内存
    free(arr);
    return 0;
}

// 算法原理总结：
// 1. 问题本质是求初始排列的"第m个下一个排列"（按字典序）
// 2. 核心使用"下一个排列"算法，该算法时间复杂度为O(n)，m最大100，总复杂度O(m*n)
// 3. 算法步骤解析：
//    - 找到可调整的位置i：保证存在更大的排列
//    - 找到交换元素j：确保交换后得到最小的可能增长
//    - 交换i和j：增大排列的前缀
//    - 反转后续元素：将后缀变为最小可能的升序，得到下一个排列